package com.xiaokong.changerecord.enums;

import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Map;
import java.util.function.Function;

/**
 * 字符串拼接模板
 *
 * @author Hu_bx
 * @date 18:18 2022/11/2
 **/
@Getter
@AllArgsConstructor
public enum StrFormatEnum {

    /**
     * 变更记录
     */
    CHANGE_TABLE_DELETE_NUM("删除了{}条,{}分别为：{}", "变更记录删除条数模板"),
    CHANGE_TABLE_SAVE_NUM("新增了{}条,{}分别为：{}", "变更记录新增条数模板"),
    CHANGE_FIELD_CHANGE("[{}]由[{}]变为了[{}]", "变更记录模板"),
    CHANGE_FORM_LABEL_CHANGE("[修改][{}]{}", "变更记录模板"),
    CHANGE_FORM_CHANGE("[修改]{}", "变更记录模板"),
    ;


    /**
     * 模板字符串
     */
    private final String template;
    /**
     * 描述
     */
    private final String desc;

    /**
     * 参数转化,例如传入decimal[] 转 保留小数字符串数组 00.00
     */
    private Function<Object[], Object[]> paramFunction;

    StrFormatEnum(String template, String desc) {
        this.template = template;
        this.desc = desc;
    }

    /**
     * paramFunction存在则处理参数转化,不存在则直接format
     * <p></p>
     * 格式化文本, {} 表示占位符<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可，如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例：<br>
     * 通常使用：format("this is {} for {}", "a", "b") =》 this is a for b<br>
     * 转义{}： format("this is \\{} for {}", "a", "b") =》 this is {} for a<br>
     * 转义\： format("this is \\\\{} for {}", "a", "b") =》 this is \a for b<br>
     *
     * @param params params
     * @return java.lang.String
     * @author Hu_bx
     * @date 18:22 2022/11/2
     **/
    public String format(Object... params) {
        if (ObjUtil.isEmpty(paramFunction)) {
            return StrUtil.format(template, params);
        }
        return StrUtil.format(template, paramFunction.apply(params));
    }


    /**
     * 格式化文本，使用 {varName} 占位<br>
     * map = {a: "aValue", b: "bValue"} format("{a} and {b}", map) ---=》 aValue and bValue
     *
     * @param map map
     * @return java.lang.String
     * @author Hu_bx
     * @date 18:22 2022/11/2
     **/
    public String format(Map<?, ?> map) {
        return StrUtil.format(template, map);
    }
}
